Ana içeriğe geç

Attestation Talebi 🎉

Bu bölümde, Claim ve Credential oluşturacağız. Ancak, oluşturduğumuz bu Credential şu an için sadece bir kağıt parçası gibi. 📜 Neden mi? Çünkü Validator'lar için bu bilginin güvenilir olabilmesi için bir Attester tarafından onaylanmış olması gerekiyor! 🤝

🌟 Yıldız İpucu 🌟

KILT, herkesin katılabileceği bir parti gibi! 🎉 Herkes veya her şey bir claim oluşturabilir ve attest edebilir. Ancak, burada dikkat etmemiz gereken bir şey var: Eğer bir Validator bir Attester'a güvenmiyorsa, o credential sadece bir kağıt parçasıdır! 🙅‍♀️

alternative text

📝 Claim Oluşturma 📝

Daha önce oluşturduğumuz light DID, ctype ve Claimer'ın sağladığı bilgilerle, sanki bir yemek tarifi oluşturur gibi bir Claim objesi oluşturacağız. 🍲

🤔 Claim Nedir? Detaylara Bir Göz Atalım 🤔
  • Öncesinde, CTypes'ı bir yemek tarifi gibi düşünebiliriz; ne yapmamız gerektiğini bize söyler. 📑🍲

  • Peki ya bu tarifi uyguladıktan sonra ne olur? Yemek tarifi olarak mı kalır? Hayır, tabii ki! 🙅‍♂️ O zaman bir yemek olur! 🍲

  • Aynı şekilde, CType'ı istediğimiz bilgilerle doldurduğumuzda, bu bir Claim olur. Claimler, Credentiallere benzer ama henüz bir Attester tarafından onaylanmamışlardır. 📝🔐

  • Attester'lar bu süreçte kritik bir rol oynarlar, tıpkı bir yemek yarışmasında jüri üyeleri gibi! 🤩 Onlar Credential'i inceleyip onaylayıp onaylamayacaklarını belirlerler. ✅

  • KILT, herkesin bir şeyler iddia edebileceği, hatta kendileri hakkında bile, açık bir sistemdir. 🌍 Ancak, bir Claim yalnızca bir Attester tarafından onaylandıysa güvenilir olabilir. Yani, Verifier'lar belirli durumlar için farklı Attester'lara güvenebilirler. 🔍🔒

Paketlerin Eklenmesi

claimer/createClaim.ts
import * as Kilt from '@kiltprotocol/sdk-js'

Paketleri dosyamıza eklerken ilk olarak gerekli tek paketin KILT-SDK olduğunu fark edebiliriz. Claim'ler diğer formatlara göre basit bir yapıya sahip olduğu için tek başına yeterli olacaktır.

createClaim Fonksiyonu

claimer/createClaim.ts
export function createClaim(
lightDid: Kilt.DidUri,
ctype: Kilt.ICType,
content: Kilt.IClaim['contents']
): Kilt.IClaim {

Dosya içerisinde Claim'in yaratılması için gerekli fonksiyonu kurabiliriz. Bu fonksiyon içerisine 3 adet parametre almaktadır. Bu parametreler bakılacak olunursa:

  1. lightDid: Kilt.DidUri: Light DID'nin URI'si. Bu, iddianın kim tarafından oluşturulduğunu belirtir.
  2. ctype: Kilt.ICType: İddianın hangi CType'a (Claim Type) uyduğunu belirtir. Yani, bu iddia hangi "form şablonu"nu kullanıyor?
  3. content: Kilt.IClaim['contents']: İddianın içeriği, yani doldurulmuş formdaki bilgiler.
ipucu

TypeScript dilinde : karakteri, bir değişkenin, parametrenin veya fonksiyonun dönüş tipinin ne olacağını belirtmek için kullanılır. Bu, tip güvenliği sağlar ve kodun daha anlaşılır olmasına yardımcı olur.

Örneğin, createClaim fonksiyonunun tanımında:

export function createClaim(
lightDid: Kilt.DidUri,
ctype: Kilt.ICType,
content: Kilt.IClaim['contents']
): Kilt.IClaim {
  • lightDid: Kilt.DidUri: Burada lightDid adlı parametrenin tipinin Kilt.DidUri olacağını belirtiyoruz.
  • ctype: Kilt.ICType: ctype parametresinin tipinin Kilt.ICType olacağını belirtiyoruz.
  • content: Kilt.IClaim['contents']: content parametresinin tipinin Kilt.IClaim['contents'] olacağını belirtiyoruz.
  • ): Kilt.IClaim {: Fonksiyonun döndüreceği değerin tipinin Kilt.IClaim olacağını belirtiyoruz.

Bu tür belirtimleri, kodunuzun daha güvenli ve anlaşılır olmasını sağlar. Örneğin, birisi bu fonksiyonu kullanırken yanlış bir tipde bir değer göndermeye çalışırsa, TypeScript bu hatayı derleme aşamasında yakalar. Bu da hataların erken teşhis edilmesine ve düzeltilmesine yardımcı olur.

İddia Oluşturma

Fonksiyonun parametrelerini belirttikten sonra içerisine girerek işlevimizi oluşturabiliriz. Bu işlem claim oluşturma eylemi olacaktır.

claimer/createClaim.ts
const claim = Kilt.Claim.fromCTypeAndClaimContents(ctype, content, lightDid)

claim oluşturulurken Kilt.Claim.fromCTypeAndClaimContents() fonksiyonu çağırılır ve içerisine parametreler girilerek claim adında bir değişken oluşturulur.

Claim'in Döndürülmesi

claimer/createClaim.ts
return claim

Son olarak, oluşturulan iddia nesnesi döndürülür.

Kodun Tamamı

Eğer kodun tamamını bir arada görmemiz gerekirse:

claimer/createClaim.ts
import * as Kilt from '@kiltprotocol/sdk-js'

// Create a Claim object from light DID, CType and given content.
export function createClaim(
lightDid: Kilt.DidUri,
ctype: Kilt.ICType,
content: Kilt.IClaim['contents']
): Kilt.IClaim {
const claim = Kilt.Claim.fromCTypeAndClaimContents(ctype, content, lightDid)

return claim
}

Bu kod parçası, bir claim oluşturmanın temelini atmaktadır. claim oluşturulduktan sonra, bu iddiayı bir "Attester" (Onaylayıcı) onaylayabilir ve daha sonra bir "Verifier" (Doğrulayıcı) tarafından doğrulanabilir.

Credential Oluşturma

alternative text

Oluşturduğumuz Claim'in attest olmasını istediğimiz için bir Credential inşa edebiliriz. Bu işlemi gerçekleştirmek için generateCredential fonksiyonunu kullanabiliriz. Bu Credential gerekli olan tüm bilgileri içerecektir. Bu sayede Attester belgeyi attest edebilecektir.

Paketlerin Eklenmesi

claimer/generateCredential.ts
import { config as envConfig } from 'dotenv'
import * as Kilt from '@kiltprotocol/sdk-js'
import { createClaim } from './createClaim'
import { generateLightDid } from './generateLightDid'
import { getCtypeSchema } from '../attester/ctypeSchema'

Paketlerin içeriklerine bakacak olursak:

  • dotenv: Ortam değişkenlerini yüklemek için kullanılır.
  • Kilt: KILT protokolü SDK'sı.
  • createClaim, generateLightDid, getCtypeSchema: Önceki kod parçalarında tanımlanmış yardımcı fonksiyonlar.

generateCredential Fonksiyonu

claimer/generateCredential.ts
export function generateCredential(
claimerDid: Kilt.DidUri,
claimAttributes: Kilt.IClaim['contents']
): Kilt.ICredential {

Credential oluşturmak için gerekli fonksiyonumuzu yazarak işe başlayabiliriz. Bu fonksiyon içerisine 2 adet parametre alacaktır. Çıktı olarak Kilt.ICredential türünde bir çıktı verecektir. Parametrelere teker teker bakmamız gerekirse:

  • claimerDid: Claimer'ın oluşturduğu Light DID'yi içerisine alır.
  • claimAttributes: İddia edilen niteliklerin listesini içerir.

Claim ve CType'ı Oluşturma

claimer/generateCredential.ts
const ctype = getCtypeSchema()
const claim = createClaim(claimerDid, ctype, claimAttributes)

Hem ctype'ı hemde claim'i oluşturma kodunu yazmıştık ve dosyamıza import etmiştik. Şimdi de bu fonksiyonları kullanarak ilk olarak CType şemasını elde edip sonrasında claim değerini oluşturma fonksiyonunu çağırabiliriz. Yani sırasıyla:

  • getCtypeSchema(): Önceden tanımlanmış bir CType şeması getirir.
  • createClaim(): Belirtilen CType ve özniteliklerle bir iddia (Claim) oluşturur.

Credential oluşturma

claimer/generateCredential.ts
console.log('Claimer -> create request')
return Kilt.Credential.fromClaim(claim)

Oluşturduğumuz fonksiyonun çıktısı olarak kısacık ama güzel bir Credential.fromClaim() kodumuzu çalıştırarak Claim üzerinden Credential'i yani kimlik belgemizi oluşturabiliriz.

Ana Kod Bloğu

Bu kısımda dosya tek başına çalıştırılırsa gerçekleşecek işlemler verilmiştir.

claimer/generateCredential.ts
if (require.main === module) {
.
.
.
})()
}

Yukarıda da ifade edildiği gibi if yapısı ile kodun tek başına çalışıp çalışmadığı kontrol edilir.

claimer/generateCredential.ts
envConfig()

Bu fonksiyon ile .env dosyasındaki ortam değişkenlerini kod içerisine ekleriz.

claimer/generateCredential.ts
    try {
.
.
.
} catch (e) {
console.log('Error while building credential')
throw e
}

Fonksiyonun çalışması için bir try catch yapısı kurulur. Eğer işlemlerde bir hata bulunursa hata kullanıcıya log yapısı ile ekrana yazdırılır.

Artık try yapısı içerisinde credential yapısı kurulabilir.

claimer/generateCredential.ts
await Kilt.init()

Try yapısı içerisine girdiğimizde credential oluşturmak için Kilt.init yapısı ile KILT SDK'yi proje içerisine ekleyebiliriz.

Mnemonik Anahtarı Al

claimer/generateCredential.ts
const claimerDidMnemonic = process.env.CLAIMER_DID_MNEMONIC as string

Ortam değişkenlerinden CLAIMER_DID_MNEMONIC'i alır ve bir string olarak saklar.

Light DID Oluşturma

claimer/generateCredential.ts
const claimerDid = generateLightDid(claimerDidMnemonic)

Daha önce diğer kod dosyasında tanımlamış olduğumuz generateLightDid fonksiyonunu kullanarak, mnemonikten bir light DID oluşturur.

Credential'ı Yaratmak

claimer/generateCredential.ts
const request = generateCredential(claimerDid.uri, 
{ age: 21,
name: 'Aybars Göktuğ Ayan'
})

console.log('⚠️ ./claimer/_credential.json dosyasına kaydet ⚠️\n\n')
console.log(JSON.stringify(request, null, 2))

Son olarak generateCredential fonksiyonu ile claim'i doldurup credential formatına getiririz. Bu fonksiyon, oluşturulan DID ve belirtilen nitelikler (age ve name) ile bir credential oluşturur. Sonrasında oluşturulan kimlik bilgisini JSON formatında konsola yazdırır.

Genel Bakış

Kodun tamamına bakacak olursak:

claimer/generateCredential.ts
import { config as envConfig } from 'dotenv'

import * as Kilt from '@kiltprotocol/sdk-js'

import { createClaim } from './createClaim'
import { generateLightDid } from './generateLightDid'
import { getCtypeSchema } from '../attester/ctypeSchema'

export function generateCredential(
claimerDid: Kilt.DidUri,
claimAttributes: Kilt.IClaim['contents']
): Kilt.ICredential {
// Create claim.
const ctype = getCtypeSchema()
const claim = createClaim(claimerDid, ctype, claimAttributes)

// Create credential and request attestation.
console.log('Claimer -> create request')
return Kilt.Credential.fromClaim(claim)
}

// Don't execute if this is imported by another file.
if (require.main === module) {
;(async () => {
envConfig()

try {
await Kilt.init()

const claimerDidMnemonic = process.env.CLAIMER_DID_MNEMONIC as string
const claimerDid = generateLightDid(claimerDidMnemonic)

const request = generateCredential(claimerDid.uri, {
age: 21,
name: 'Aybars Göktuğ Ayan'
})
console.log(
'⚠️ save this to ./claimer/_credential.json for testing ⚠️\n\n'
)
console.log(JSON.stringify(request, null, 2))
} catch (e) {
console.log('Error while building credential')
throw e
}
})()
}

Sırasıyla inceleyecek olursak:

  • Paketleri ekleriz.
  • Claim oluştururuz
  • Claim ile Credential oluştururuz ve zincire kaydederiz.

Programı çalıştırmak

Yazdığımız birbirine bağlı 2 kodu çalıştırmak için kilt-rocks klasöründe olduğumuza emin olduktan sonra alt kısımdaki kodu çalıştırabiliriz.

yarn ts-node claimer/generateCredential.ts

uyarı

Attestation'lar Attester'lar tarafından onaylandıktan sonra zincir üzerine kaydedilirler. Bu işlem bir depozito gerektirir. Her Credential birbirinden özeldir. Test yaparken genel olarak credential'ları depolayıp yeniden kullanıma sokarak birden fazla attestation işleminin önüne geçmiş oluruz.

Bu belgeyi kaydetmek için ./claimer/_credential.json konumunda bir dosya oluşturup içerisine bilgileri yazabiliriz. Hatta bu credential'ı arkadaşlarınız ile paylaşıp onların kullanmasını da sağlayabilirsiniz.

Afferin bize

Evet, artık Claimer olarak Claim oluşturduk ve bu Claim içerisinden credential oluşturduk. Şimdi attester'ı tamamlayarak credential'ı attest edelim.